介紹
適配器模式用來將一介面轉變為另一個介面。
適配器模式在legacy code與新code結合的過程有不錯的效果。Legacy code因存在時間長,已有大量用戶使用,更變介面會使所有使用此介面的程式都需要修改。此時可在legacy code介面再"套上"一層新介面(適配器模式),新code可用此新介面來實現新功能,而使用legacy code原介面的程式則不受影響。
可把適配器模式想像成多國轉換插座,各國的插座孔及電壓都不同,旅行時透過多國轉換插座將插座轉換我們電子產品可用的模式。
#include <iostream>
// 抽象轉換器
class Adapter
{
public:
virtual void Show() = 0;
virtual ~Adapter() {}
};
// 外星人插座
class AlienPlug
{
public:
void ShowType()
{
std::cout << "Alien type: 100 holes, 999 Volt" << std::endl;
}
};
// 將TW插座轉換成外星人插座的轉換器
class TWAdapter : public Adapter
{
public:
TWAdapter(AlienPlug &p) : m_pPlug(p) {}
virtual void Show() override
{
std::cout << "You are using TW adapter to alien plug" << std::endl;
// Do some convert tasks
//...
m_pPlug.ShowType();
}
private:
AlienPlug &m_pPlug;
};
// 將US插座轉換成外星人插座的轉換器
class USAdapter : public Adapter
{
public:
USAdapter(AlienPlug &p) : m_pPlug(p) {}
virtual void Show() override
{
std::cout << "You are using US adapter to alien plug" << std::endl;
// Do some convert tasks
//...
m_pPlug.ShowType();
}
private:
AlienPlug &m_pPlug;
};
int main()
{
// 外星人插座
AlienPlug alienPlug;
// 插上TW轉換插座
TWAdapter twPlug(alienPlug);
twPlug.Show();
// 插上US轉換插座
USAdapter usPlug(alienPlug);
usPlug.Show();
return 0;
}
Output:
You are using TW adapter to alien plug
Alien type: 100 holes, 999 Volt
You are using US adapter to alien plug
Alien type: 100 holes, 999 Volt